/*
 *  main.c
 *
 *  Created by Per-Anders Enarsson, DSY07
 *  Limited Copyright 2008. All rights reserved.
 *  Open source. Mailware. Might still be available at google code, search for DSY07
 *  You're allowed to use the code. And if you find it useful, send a mail to pason_67@yahoo.se
 *
 * Revision 1.0 20080926
 *
 * ToDo:
 * Kontrollera vilka bokstäver som finns med i namn.
 * Hantera å,ä,ö rätt i namn
 * Endast tillåta siffror, plus o minus i telefonnummer
 * Byta lagringssystem/fil till ett mer flexibelt.
 * Default filnamn om inget anges
 * Införa hjälpfunktion
 *
 * Instruktioner till hur man använder telfonlistan.
 *
 * 0. Avsluta:
 * Avslutar programmet.
 *
 * 1. Lägg till post:
 * Lägger till en post till databasen. Om exakt samma post redan finns så läggs den ej till. Små bokstäver konverteras till stora för att undvika sorteringsproblem. 
 * 
 * 2. Radera post:
 * Raderar valt nummer.
 *
 * 3. Sök efter post:
 * Du har två val, exakt eller delvis rätt.
 * Dvs "Enar" ger ingen exakt träff på "ENARSSON" men om meny "delvis rätt" vald så fås träff. Stora eller små bokstäver är egalt.  Eller gäller mellan sökfälten, dvs Efternamn ELLER Förnamn ELLER Telefonnummer skall vara träff för att listas.
 * 
 * 4.Radera post:
 * Mata in numret på post som ska bort. Hitta numret mha sökfunktionen eller listfunktionen.
 * 
 * 5. Spara till fil:
 * Sparar till fil. Om fil redan finns får valet att:Lägga till data, skriva över data eller välja nytt filnamn.
 * 
 * 6. Öppna fil:
 * Öppnar vald fil. Om det redan finns poster i minnet får kan man välja att skriva över dessa eller att lägga till inlästa poster till listan. Om inläst post redan finns i listan så läggs ingen dublett in.
 * 
 * Antal poster:
 * Här visas antalet poster i databasen
 * 
 * Senaste filnamn:
 * Här visas senaste filnamn som antingen öppnades eller sparades.
 */

#include <stdio.h>
#include <stdlib.h>
#include "list.h"
#include "support.h"

#define VERBOSE 1
#define NO_VERBOSE 0

/*
 **********************************************************
 * Globals
 **********************************************************
 */

char gName[50],fName[50],phoneNumber[50],rFileName[24];
int nodes=0;

/*
 **********************************************************
 * Prototyper
 **********************************************************
 */

int   showMenu();
int   getChoise();
int   getUserData();
int   getChoiseNr();
int   insertSortedToList();
int   saveToFile();
int   searchForNodes();
int   checkIfOverwrite();
char  *fileName();

/*
 **********************************************************
 * Hämtar data
 **********************************************************
 */
int getUserData()
{
   printf("Enter given name : \n");   scanf("%s",gName);skipGarb();*gName=toUpperCase(gName);
   printf("Enter familyname : \n");   scanf("%s",fName);skipGarb();*fName=toUpperCase(fName);
   printf("Enter phonenumber: \n");   scanf("%s",phoneNumber);skipGarb();
   return 0;
}

/*
 **********************************************************
 * Skriver ut menyn på skärmen
 **********************************************************
 */

int showMenu()
{
   clearScreen();
	
   printf("****************************************\n");
   printf("**    Main menu phoneregister         **\n");
   printf("**                                    **\n");
   printf("**        0 Quit                      **\n");
   printf("**        1 Add entry                 **\n");
   printf("**        2 Delete entry              **\n");
   printf("**        3 Search for entry          **\n");
   printf("**        4 Print complete list       **\n");
   printf("**        5 Save to file              **\n");
   printf("**        6 Open from file            **\n");
   //   printf("**        7 Help                      **\n");
   printf("**    Items in database(%5i)        **\n",nodes);
   printf("**                                    **\n");
   printf("** Recent filename:%19s**\n",rFileName);
   printf("****************************************\n");
   return 0;
}

/*
 **********************************************************
 * Hämtar in vilket menyval som önskas
 **********************************************************
 */

int getChoise()
{
   int i=-1;                                                //Sätt i till ogiltigt
   while(1==1)                                              //Snurra tills break
   {
      printf("\nChoose menu item: \n"); scanf("%i", &i); 
      skipGarb();
      
      if(i>=0&&i<=6)                                        //Förväntar mig 0 til 7
         return i;                                          //Returnera resultat
      else{
         printf("\nNonvalid input, select from 1 to 6 \n"); printf("Press enter to continue"); getchar();
      }
   }
}

/*
 **********************************************************
 * Hämtar in vilken postnr som önskas
 **********************************************************
 */

int getChoiseNr()
{
   int i=-1;                                                //Sätt i till en siffra som tvingar omval
   if(nodes==0)
   {
      printf("\n List is empty, press enter to continue");
      getchar();
      return -1;
   }
   
   printf("Choose  number to delete:\n");
   while(i<0||i>nodes)                                      //Snurra tills giltigt val?
   {
      scanf("%i", &i); skipGarb();
      if(i<0||i>nodes) printf("\nInvalid number, select from 1 to %d \n",nodes);
   }
   return i;
}

/*
 **********************************************************
 * Söker efter post(er)
 **********************************************************
 */


int searchForNodes(List *myList)
{
   int sChoise=0;
   clearScreen();
   
   printf("****************************************\n");
   printf("**    Search menu phoneregister       **\n");
   printf("**                                    **\n");
   printf("**        0 Quit                      **\n");
   printf("**        1 Search exact match        **\n");
   printf("**        2 Search for part match     **\n");
   printf("**                                    **\n");
   printf("** Fields with only '0' will not be   **\n");
   printf("** searched!                          **\n");
   printf("****************************************\n");
   
   scanf("%d",&sChoise);
   skipGarb();
   if(sChoise==0) return 0;
   
   if(sChoise==1||sChoise==2){
      getUserData();
      searchInList(myList,sChoise);
   }
   return 0;
}

/*
 **********************************************************
 * Frågar om nuvarande poslista skall skrivas över
 **********************************************************
 */

int checkIfOverwrite(){
   
   if(nodes>=1){
      int sChoise=0;
      clearScreen();
      
      printf("****************************************\n");
      printf("** !! List in memory is not empty !!  **\n");
      printf("**                                    **\n");
      printf("**        0 Cancel import             **\n");
      printf("**        1 Append list               **\n");
      printf("**        2 OverWrite list            **\n");
      printf("**  Duplicates will be thrown!        **\n");
      printf("****************************************\n");
      
      scanf("%d",&sChoise);
      skipGarb();
      return sChoise;
   }
   return 2;
}


/*
 **********************************************************
 * Frågar om filen skall skrivas över
 **********************************************************
 */


int checkIfOverwriteFile(){
   
   if(nodes>=1){
      int sChoise=0;
      clearScreen();
      
      printf("****************************************\n");
      printf("**      !! File is not empty !!       **\n");
      printf("**                                    **\n");
      printf("**        0 Cancel export             **\n");
      printf("**        1 Owerwrite list            **\n");
      printf("**        2 Append list               **\n");
      printf("**        3 Save as new name          **\n");
      printf("****************************************\n");
      
      scanf("%d",&sChoise);
      skipGarb();
      return sChoise;
   }
   return 2;
}


/*
 **********************************************************
 * Main
 **********************************************************
 */

int main(int argc, char *argv[])
{
   int err,choise=0,oW;
   
   List *theList=malloc(sizeof(List));                      //Skapa tom lista, allokera minne
   initList(theList);                                       //Initiera lista
   while (1==1) 
   {
      showMenu();                                           //Visa menyn
      choise = getChoise();                                 //Hämta val
      
      switch(choise)
      {
         case 0: return 0;   break;                         //Avsluta, fast breaken behövs egentligen inte
         case 1: getUserData(); insertSortedToList(theList,1); break;
         case 2: err=removeInList(theList,getChoiseNr()); break;
         case 3: searchForNodes(theList); break;
         case 4: printList(theList); printf("\nPress enter to continue"); getchar(); break;
         case 5: saveListToFile(theList);break;
         case 6:
            oW=checkIfOverwrite();
            if(oW!=0){
               if(oW==2){
                  destroyList(theList);
                  List *theList=malloc(sizeof(List));       //Skapa tom lista, allokera minne
                  initList(theList); 
               }
               openListFromFile(theList,fileName());
            }
            break;
            //         case 7: ;break;
         default: break;
      }
   }
   
   destroyList(theList);                                    //Döda listan
   return 0;
}